/**
 * @author: jw
 */
//接入 ajax 工具
import axios from "axios";
export { axios };
window.axios = axios;
axios.defaults.baseURL = "api";
axios.defaults.timeout = 100; //超时(0为永不超时)
// axios.defaults.headers.common['Content-Type'] = 'application/json';
// axios.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded';
// axios.defaults.headers.common['Content-Type'] = 'application/from-data';
// axios.defaults.withCredentials = true; //允许带上cookie
// axios.defaults.transformRequest = function (data, headers) {
//   // console.log(data, headers);
//   // headers.common['Cookie'] = 'd=9';
//   return data;
// };

// export const postFormData = function (url, param, cancelToken, callback, isShowSpin = false) {
//   /*axios 提交FromData,使用qs库格式化参数 */
//   var option = {
//     url: url,
//     method: 'post',
//     data: qs.stringify(param), // 发送请求要传的FormData参数。必须用 qs.stringify（）序列化一下
//     headers: {
//       'content-type': 'application/x-www-form-urlencoded'
//     }, // 请求头，发送FormData格式的数据，必须是 这种请求头。
//     cancelToken: cancelToken,
//     isShowSpin
//   };
//   return request(option, callback);
// };

export function ajax(option, config = {}) {
  let axiosOption = {
    ...option,
    ...config
  };
  console.log("%c %s %O", "color:blue", "[ajax请求][axiosOption]", axiosOption, option, config);
  let ajax = axios(axiosOption)
    .then((res) => res.data)
    .catch((error = {}) => {
      console.warn("[ajax 请求异常]:", error);
      let message = "接口请求异常";
      let status = (error.response || {}).status;
      switch (status) {
        case 400:
          message = "接口请求参数异常";
          break;
        case 401:
          message = "接口权限不足";
          break;
        case 403:
          message = "接口请求被服务器拒绝";
          break;
        case 404:
          message = "接口地址不存在";
          break;
        case 500:
          message = "接口服务器异常";
          break;
        default:
          message = error.message || "接口请求异常";
      }
      return {
        code: 0,
        message,
        error
      };
    });
  return ajax;
}

/////////////
import * as apiDoc from "./api.js";
import { getApi, getApiMock } from "./api.js";
export { apiDoc };
import { dev, apiUrl } from "@/../vue.devServer.js";
// console.log('[vue.devServer.js]',dev, apiUrl);
export function getApiOptionDEV(apiName, param) {
  /** ========开发模式======== */
  // console.log("项目环境判断", dev);
  if (!dev) {
    return;
  }
  document.cookie = "apiUrl=" + apiUrl;
  let option = {
    headers: {
      apiUrl: apiUrl
    }
  };
  if (!dev) {
    //不使用模拟数据
    return option;
  }
  /*接口异常时才使用模拟数据*/
  option.dev = dev; //模拟数据
  option.mock = getApiMock(apiName, param); //模拟数据

  if (axios.mockInterceptor == null) {
    axios.mockInterceptor = axios.interceptors.response.use(null, function(error) {
      // 对响应错误做点什么
      console.warn("[axios拦截接口响应异常]", error);
      let config = (error || {}).config || {};

      let resError = {
        data: {
          code: 0,
          message: (error || {}).message,
          request: config,
          error
        }
      };

      if ((error || {}).code == "ECONNABORTED") {
        resError.data.message = "请求超时";
      }

      if (config.mock) {
        //使用模拟数据
        resError.data = config.mock;
      }

      // console.warn("[使用模拟数据(axios 拦截接口响应)]", config, error);
      return resError;
    });
  }
  /*直接使用模拟数据*/
  if (axios.mockInterceptorRequest == null) {
    axios.mockInterceptorRequest = axios.interceptors.request.use(function(config) {
      if (config && config.dev == "mockOnly") {
        // console.warn("[直接使用模拟数据(axios 拦截接口请求)]", config);
        //拦截请求,中断请求,Promise.reject返回异常信息让接口强制使用模拟数据
        return Promise.reject(config);
      }
      return config; //接口异常时才使用模拟数据
    });
  }
  return option;
}

export function getApiOption(apiName = "", param) {
  // console.error("[getApi]", api, apiDoc);
  let api = getApi(apiName, param);
  let option = api && api.paramSet ? api.paramSet(param) : api;
  option = Object.assign(option, getApiOptionDEV(apiName, param));
  // console.error("[getApiOption]", option);
  return option;
}

export function $api(apiName, param, config = {}) {
  // console.log("[接口请求][$api]", apiName, "[param, config]", param, config, "[this]", this);
  let apiOption = getApiOption(apiName, param);
  let result = apiOption
    ? ajax(apiOption, config)
    : Promise.resolve({
        code: 0,
        message: `接口 [${apiName}] 不存在`
      });
  return result;
}
